package com.lollipop.synthential.concurrency.atomicdemo;

/**
 * @Author: J.K
 * @Date: 2021-04-13 09:25
 * @Description: 并发编程-使用多线程的坑:为什么i++不是单线程运行的效果？-->i++实际为i=i+1操作，非原子操作，在多线程中会出问题
 */
public class AtomicIntegerDemo1 {
    private static final int THREADS_COUNT = 20;
    private static int count = 0;

    private static void increase() {
        count++;
    }

    public static void main(String[] args) {
        Thread[] threads = new Thread[THREADS_COUNT];
        for (int i = 0; i < THREADS_COUNT; i++) {
//            threads[i] = new Thread(new Runnable() {
//                @Override
//                public void run() {
//                    for (int j = 0; j < 1000; j++) {
//                        increase();
//                    }
//                }
//            });
            // 使用lambda表达式更简洁
            threads[i] = new Thread(() -> {
                for (int j = 0; j < 1000; j++) {
                    increase();
                }
            });
            threads[i].start();
        }
//        for (int i = 0; i < 10; i++) {
//            new Thread() {
//                @Override
//                public void run() {
//                    for (int j = 0; j < 1000; j++) {
//                        increase();
//                    }
//                }
//
//                ;
//            }.start();
//        }
        // 保证前面的线程都执行完成，得到多线程操作下的最终结果
        while (Thread.activeCount() > 1) {
            // 使当前线程由执行状态，变成为就绪状态，让出cpu时间，在下一个线程执行时候，此线程有可能被执行，也有可能没有被执行
            Thread.yield();
        }
        // 预期值是2000，但实际运行结果不是每次都是2000，大多数情况下会小于2000
        System.out.println(count);
    }

}
